package com.mastercard.assets.web.util.reportes;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.reporteForm;
import java.util.ArrayList;
import java.util.List;

public class reportThree {
    
    public static List< datosReporteTres > generaReporteTres( reporteForm f ) throws MasterCardException{
        
        List< datosReporteTres > res = new ArrayList< datosReporteTres >( ) ;

        String sql = "Select c.bandera, p.nombre, cu.nombre, cp.cve_campania, c.nombre, "
                + "count(paq.cve_paquete), ase.nombre, c.fecha_ini, c.fecha_fin "
                + "from "
                + "tbl_paquete as paq, tbl_asset as ase, tbl_campania_paquete as cp, tbl_paises as p, "
                + "tbl_usuario as us, tbl_campania as c, tbl_cuenta as cu "
                + "where "
                + "paq.cve_asset = ase.cve_asset and cp.cve_paquete = paq.cve_paquete and c.cve_cuenta = cu.cve_cuenta "
                + "and us.cve_usuario = c.cve_usuario_resp and p.cve_pais = us.cve_pais and c.`status`= 1 "
                + "and c.cve_campania = cp.cve_campania" ;
        
        if( f.getPaisR3( ) != 0 ){
            
            sql = sql +" and p.cve_pais = " + f.getPaisR3( ) + "" ;
            
        }
        
        if( f.getCuentaR3( ) != 0 ){
            
            sql = sql +" and cu.cve_cuenta = " + f.getCuentaR3( ) + "" ;
            
        }
        
        if( f.getStatus( ) != 0 ){
            
            sql = sql +" and c.bandera = " + f.getStatus( ) + "" ;
            
        }
        
        if (f.getAnioR3( ) != 0) {

           String ini = "",
                   fin = "", 
                   mesDiaIni = "-01-01",
                   mesDiaFin = "-12-31",
                   fecAnioIni = f.getAnioR3( ) + "-01-01",
                   fecAniofin = f.getAnioR3( ) + "-12-31" ;
            
            if( f.getPeriodoR3( ).equals("Por Mes") && f.getMesQR3( ) > 0 ){// ini por mes
                
                mesDiaIni = ( f.getMesQR3( ) < 10 ? "-0" +f.getMesQR3( )+"-31" : "-" + f.getMesQR3( ) ) ;
                mesDiaFin = ( f.getMesQR3( ) < 10 ? "-0" +f.getMesQR3( )+"-01" : "-" + f.getMesQR3( ) ) ;
                
            }else// fin por mes
                if( f.getPeriodoR3( ).equals("Por Cuarto") && f.getMesQR3( ) > 0 ){// ini por Cuarto
                    
                    if( f.getMesQR3( ) == 13 ){
                        
                        mesDiaIni = "-03-31" ;
                        mesDiaFin = "-01-01" ;
                                
                    }else
                        if( f.getMesQR3( ) == 14 ){
                            
                            mesDiaIni = "-06-31" ;
                            mesDiaFin = "-04-01" ;
                            
                        }else
                            if( f.getMesQR3( ) == 15 ){
                                
                                mesDiaIni = "-09-31" ;
                                mesDiaFin = "-07-01" ;
                            }else
                                if( f.getMesQR3( ) == 16 ){
                                    
                                    mesDiaIni = "-12-31" ;
                                    mesDiaFin = "-10-01" ;
                                    
                                }                    
                    
                }// fin por Cuarto
            
            ini = "" + f.getAnioR3( ) + "" + mesDiaIni ;
            fin = "" + f.getAnioR3( ) + "" + mesDiaFin ;
            
            if( f.getPeriodoR3( ).equals("Total") || f.getMesQR3( ) == 0  ){
                
                sql = sql + " and (c.fecha_ini between '" + fecAnioIni + "' and '" + fecAniofin + "' or "
                    + "c.fecha_fin between '" + fecAnioIni + "' and '" + fecAniofin + "')";
                
            }else{
                
                sql = sql + " and (c.fecha_ini between '" + fecAnioIni + "' and '" + fecAniofin + "' or "
                    + "c.fecha_fin between '" + fecAnioIni + "' and '" + fecAniofin + "') "
                        + "and c.fecha_ini <= '" + ini + "' and c.fecha_fin >= '" + fin + "'" ;                
                
            }
            

        }
        
        sql = sql + " group by c.cve_campania, ase.cve_asset" ;
        
        try{
            
            res = MasterCardDAO.datosParaReporteTres( sql ) ;
            
            
        }catch( Exception e ){
            
            e.printStackTrace( ) ;
            
        }
        
        return res ;
        
    }
    
    public static totalesReporteTres totalesParaR3( List< datosReporteTres > lRep, reporteForm f ) throws MasterCardException{
        
        totalesReporteTres tr3 = new totalesReporteTres( ) ;
        
        List< datosReporteTres > temp = new ArrayList< datosReporteTres >( ) ;
        
        int anioReporte = f.getAnioR3( ) ;
        
        for( datosReporteTres r : lRep ){// INI barre el arreglo de registros reporte
            
            String fecIni = r.getIni( ).toString( ) ,
                    fecFin = r.getFin( ).toString( ) ,
                    mesIni = fecIni.substring(5, 7) ,
                    mesFin = fecFin.substring(5, 7) ,
                    anioIni = fecIni.substring(0, 4) ,
                    anioFin = fecFin.substring(0, 4) ;
                
            int mIni = Integer.parseInt( mesIni ) ,
                    mFin = Integer.parseInt( mesFin ) ,
                    yearIni = Integer.parseInt( anioIni ) ,
                    yearFin = Integer.parseInt( anioFin ) ;
            
            if( f.getPeriodoR3( ).equals("Por Mes") ){
                
                boolean esta = false ;
                    
                    if( !temp.isEmpty( ) ){
                            
                            for( datosReporteTres listaCompara : temp ){
                                
                                if( listaCompara.getBc( ) == r.getBc( ) ){
                                    
                                    esta = true ;
                                    break ;
                                    
                                }
                                
                            }
                            
                        }else{
                            
                            tr3 = resultadosTotales( 0, anioReporte, mIni, mFin, yearIni, yearFin, tr3, f ) ;
                            temp.add( r ) ;
                            esta = true ;
                            
                        }
                        
                        if( !esta ){
                            
                             tr3 = resultadosTotales( 0, anioReporte, mIni, mFin, yearIni, yearFin, tr3, f ) ;
                             temp.add( r ) ;
                            
                        }
                
                
            }else
                if( f.getPeriodoR3( ).equals("Por Cuarto") ){
                    
                    boolean esta = false ;
                    
                    if( !temp.isEmpty( ) ){
                            
                            for( datosReporteTres listaCompara : temp ){
                                
                                if( listaCompara.getBc( ) == r.getBc( ) ){
                                    
                                    esta = true ;
                                    break ;
                                    
                                }
                                
                            }
                            
                        }else{
                            
                            tr3 = resultadosTotales( 1, anioReporte, mIni, mFin, yearIni, yearFin, tr3, f ) ;
                            temp.add( r ) ;
                            esta = true ;
                            
                        }
                        
                        if( !esta ){
                            
                             tr3 = resultadosTotales( 1, anioReporte, mIni, mFin, yearIni, yearFin, tr3, f ) ;
                             temp.add( r ) ;
                            
                        }
                    
                    
                }else
                    if( f.getPeriodoR3( ).equals("Total" ) ){
                        
                        boolean esta = false ;
                        
                        if( !temp.isEmpty( ) ){
                            
                            for( datosReporteTres listaCompara : temp ){
                                
                                if( listaCompara.getBc( ) == r.getBc( ) ){
                                    
                                    esta = true ;
                                    break ;
                                    
                                }
                                
                            }
                            
                        }else{
                            
                            temp.add( r ) ;
                            esta = true ;
                            
                        }
                        
                        if( !esta )
                            temp.add( r ) ;
                        
                    }
                
                
            }// FIN barre el arreglo de registros reporte
            
        
        tr3.setTotal( temp.size( ) ) ;
        
        return tr3 ;
        
    }
    
    public static totalesReporteTres resultadosTotales( int tipo, int anioReporte, int mesIni, int mesFin, int anioIni, int anioFin,
            totalesReporteTres tRep, reporteForm f ){
                
        
        if( mesFin < mesIni ){
            
            if( anioReporte == anioIni ){
                
                tRep = calculaMeses( mesIni , 13 , tRep, tipo, f ) ;
                
            }else if( anioReporte == anioFin ){
                
                tRep = calculaMeses( 1 , mesFin , tRep, tipo, f ) ;
                
            }
            
        }else
            if( mesFin > mesIni ){
                
                tRep = calculaMeses( mesIni , mesFin , tRep, tipo, f ) ;
                
            }else
                if( mesFin == mesIni ){
                    
                    tRep = calculaMeses( mesIni , mesFin + 1 , tRep, tipo, f ) ;
                    
                }
        
        
        return tRep ;
        
    }
    
    public static totalesReporteTres calculaMeses( int ini , int fin , totalesReporteTres tr , int tipo, reporteForm f ){
                
        if( tipo == 1 ){
            int q1 = 0, q2 = 0, q3 = 0, q4 = 0 ;
            for( int x = ini ; x <= fin ; x++ ){// INI for a meses para CUARTOS
            
                if( ( x == 1 || x == 2 || x == 3 ) && ( q1 == 0 ) && ( f.getMesQR3( ) == 13  || f.getMesQR3( ) == 0 ) ){
                    tr.setQ1( tr.getQ1( ) + 1 ) ;
                    q1 = 1 ;
                }else
                    if( ( x == 4 || x == 5 || x == 6 ) && ( q2 == 0 ) && ( f.getMesQR3( ) == 14 || f.getMesQR3( ) == 0 ) ){
                        tr.setQ2( tr.getQ2( ) + 1 ) ;
                        q2 = 1 ;
                    }else
                        if( ( x == 7 || x == 8 || x == 9 ) && ( q3 == 0 ) && ( f.getMesQR3( ) == 15 || f.getMesQR3( ) == 0 ) ){
                            tr.setQ3( tr.getQ3( ) + 1 ) ;
                            q3 = 1 ;
                        }else
                            if( ( x == 10 || x == 11 || x == 12 ) && ( q4 == 0 ) && ( f.getMesQR3( ) == 16 || f.getMesQR3( ) == 0 ) ){
                                tr.setQ4( tr.getQ4( ) + 1 ) ;
                                q4 = 1 ;
                            }

            }// FIN for a meses para CUARTOS
            
        }else{
            
            if( f.getPeriodoR3( ).equals("Por Mes") && f.getMesQR3( ) == 0 ){// SI ES POR MES Y PARA TODOS LOS MESES
                
                for( int x = ini ; x <= fin ; x++ ){// INI for a meses
                    if( x == 1 ){
                        tr.setEnero( tr.getEnero( ) + 1 ) ;
                    }else
                        if( x == 2 ){
                            tr.setFebrero( tr.getFebrero( ) + 1 ) ;
                        }else
                            if( x == 3 ){
                                tr.setMarzo( tr.getMarzo( ) + 1 ) ;
                            }else
                                if( x == 4 ){
                                    tr.setAbril( tr.getAbril( ) + 1 ) ;
                                }else
                                    if( x == 5 ){
                                        tr.setMayo( tr.getMayo( ) + 1 ) ;
                                    }else
                                        if( x == 6 ){
                                            tr.setJunio( tr.getJunio( ) + 1 ) ;
                                        }else
                                            if( x == 7 ){
                                                tr.setJulio( tr.getJulio( ) + 1 ) ;
                                            }else
                                                if( x == 8 ){
                                                    tr.setAgosto( tr.getAgosto( ) + 1 ) ;
                                                }else
                                                    if( x == 9 ){
                                                        tr.setSeptiembre( tr.getSeptiembre( ) + 1 ) ;
                                                    }else
                                                        if( x == 10 ){
                                                            tr.setOctubre( tr.getOctubre( ) + 1 ) ;
                                                        }else
                                                            if( x == 11 ){
                                                                tr.setNoviembre( tr.getNoviembre( ) + 1 ) ;
                                                            }else
                                                                if( x == 12 ){
                                                                    tr.setDiciembre( tr.getDiciembre( ) + 1 ) ;
                                                                }
                }// FIN for a meses
                
            }else
                if( f.getPeriodoR3( ).equals("Por Mes")  && f.getMesQR3( ) > 0 ){ // Si es por mes y para un mes especifico
                    
                    for( int x = ini ; x <= fin ; x++ ){// INI for a meses
                        if( x == 1 && f.getMesQR3( ) == 1 ){
                            tr.setEnero( tr.getEnero( ) + 1 ) ;
                        }else
                            if( x == 2 && f.getMesQR3( ) == 2 ){
                                tr.setFebrero( tr.getFebrero( ) + 1 ) ;
                            }else
                                if( x == 3 && f.getMesQR3( ) == 3 ){
                                    tr.setMarzo( tr.getMarzo( ) + 1 ) ;
                                }else
                                    if( x == 4 && f.getMesQR3( ) == 4 ){
                                        tr.setAbril( tr.getAbril( ) + 1 ) ;
                                    }else
                                        if( x == 5 && f.getMesQR3( ) == 5 ){
                                            tr.setMayo( tr.getMayo( ) + 1 ) ;
                                        }else
                                            if( x == 6 && f.getMesQR3( ) == 6 ){
                                                tr.setJunio( tr.getJunio( ) + 1 ) ;
                                            }else
                                                if( x == 7 && f.getMesQR3( ) == 7 ){
                                                    tr.setJulio( tr.getJulio( ) + 1 ) ;
                                                }else
                                                    if( x == 8 && f.getMesQR3( ) == 8 ){
                                                        tr.setAgosto( tr.getAgosto( ) + 1 ) ;
                                                    }else
                                                        if( x == 9 && f.getMesQR3( ) == 9 ){
                                                            tr.setSeptiembre( tr.getSeptiembre( ) + 1 ) ;
                                                        }else
                                                            if( x == 10 && f.getMesQR3( ) == 10 ){
                                                                tr.setOctubre( tr.getOctubre( ) + 1 ) ;
                                                            }else
                                                                if( x == 11 && f.getMesQR3( ) == 11 ){
                                                                    tr.setNoviembre( tr.getNoviembre( ) + 1 ) ;
                                                                }else
                                                                    if( x == 12 && f.getMesQR3( ) == 12 ){
                                                                        tr.setDiciembre( tr.getDiciembre( ) + 1 ) ;
                                                                    }
                    }// FIN for a meses
                    
                }
            
        }
        
        return tr ;
    }
    
}
